package com.hmdp.utils;

import cn.hutool.json.JSONUtil;
import com.hmdp.entity.Shop;
import com.hmdp.mapper.ShopMapper;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Collections;

// 确实 是 有效的
@Component
public class CacheWarmer {
    @Resource
    private StringRedisTemplate StringRedisTemplate;

    @Resource
    private ShopMapper shopMapper;
    /**
     * warmCache
     * @author senfel
     * @date 2024/9/4 16:12
     * @return void
     */
    @PostConstruct  // 这个 类 纳入spring容器 管理， 所以 会自动 创建其 对象而 这个 注解的 作用 就是 在 Bean创建 完成 之后 执行的 代码 属于 BEan的 生命周期
    public void warmCache() {
        // 加载热点数据
        loadHotData();  // 缓存 预热
//        // 加载关键数据
//        loadKeyData();
//        // 加载静态数据
//        loadStaticData();
    }

    /**
     * loadHotData
     * @author senfel
     * @date 2024/9/4 16:12
     * @return void
     */
    private void loadHotData() {  // 这个 主要 就是 为了 加载 商店的 数据
//        // 从数据库或其他数据源加载热点数据
//        List<String> hotData = getHotDataFromDatabase();
//        // 将热点数据保存到Redis中
//        for (String data : hotData) {
//            redisTemplate.opsForValue().set("hot:" + data, data);
//        }

        // 就 先 全部 吧 没办法

        shopMapper.selectList(null).forEach(shop -> {
            RedisData redisData = new RedisData();
            redisData.setData(shop);  // 缓存预热 做 20 分钟
            redisData.setExpireTime(LocalDateTime.now().plusMinutes(20));  // 这个 是  2 分钟 之后 过期
            // 3.写入Redis
            StringRedisTemplate.opsForValue().set( RedisConstants.CACHE_SHOP_KEY + shop.getId(), JSONUtil.toJsonStr(redisData));
        });


    }

    /**
     * loadKeyData
     * @author senfel
     * @date 2024/9/4 16:13
     * @return void
     */
//    private void loadKeyData() {
//        // 从数据库或其他数据源加载关键数据
//        List<String> keyData = getKeyDataFromDatabase();
//        // 将关键数据保存到Redis中
//        for (String data : keyData) {
//            redisTemplate.opsForValue().set("key:" + data, data);
//        }
//    }
//
//    /**
//     * loadStaticData
//     * @author senfel
//     * @date 2024/9/4 16:13
//     * @return void
//     */
//    private void loadStaticData() {
//        // 从数据库或其他数据源加载静态数据
//        List<String> staticData = getStaticDataFromDatabase();
//        // 将静态数据保存到Redis中
//        for (String data : staticData) {
//            redisTemplate.opsForValue().set("static:" + data, data);
//        }
//    }
//
//    private List<String> getHotDataFromDatabase() {
//        // 从数据库加载热点数据
//        return Collections.singletonList("Hot Data");
//    }
//
//    private List<String> getKeyDataFromDatabase() {
//        // 从数据库加载关键数据
//        return Collections.singletonList("Key Data");
//    }
//
//    private List<String> getStaticDataFromDatabase() {
//        // 从数据库加载静态数据
//        return Collections.singletonList("Static Data");
//    }

}
